ASSUME CS:Kodas, DS:Duom, SS:Stekas 

Stekas  SEGMENT PARA 'STACK'
        DB 256 dup (?)
Stekas  ENDS 
    

Duom    SEGMENT
	help    DB ', IIk. . 2 programa nr.24. Parasykite programa, kuri', 10, 13, 'atlieka operacija XOR dviem beveik bet kokio ilgio dvejetainiams skaiciams,', 10, 13, 'esantiems failuose, ir isveda rezultata i trecia faila.', 10, 13, 'Pvz.: antra duom1.txt duom2.txt rez.txt atliktu operacija XOR skaiciams,', 10, 13, 'esantiems duom1.txt ir duom2.txt, o rezultata issaugotu rez.txt'
	klaidaA DB 'Nepavyko atidaryti failo nuskaitymui'
	klaidaS DB 'Nepavyko sukurti rezultatu failo'
	klaidaU DB 'Nepavyko uzdaryti failo'
	klaidaN DB 'Nepavyko nuskaityti failo'
	klaidaI DB 'Nepavyko irasyti i faila'
	klaidaD DB 'Duomenu faile rastas ne dvejetainis skaicius'
	sekme   DB 'Programa sekmingai baige darba' 
	vardas	DB 0FFh, 100h DUP ('$')
	duom1f  DB ?,?
	duom2f  DB ?,?
	rezf    DB ?,?
        buffd1  DB 20 DUP (?)
	buffd2  DB 20 DUP (?)
	buffrez DB 20 DUP (?)	
Duom    ENDS   


Kodas   SEGMENT 
Pradzia: 
    MOV ax, Stekas
	MOV ss, ax
	MOV ax, Duom
	MOV ds, ax 
	
    MOV bx, 81h
    LEA si, vardas
    MOV cl, 0

Vardai:	                               ;sitas dalykas nuskaitys parametrus (failu vardus) ir susides juos i buferi 'vardas' 
    MOV ax, es:[bx]
    INC bx
    
    CMP ax, 3F2Fh                      ;iesko /?
    JE Helpas
    
    CMP al, 20h                        ;iesko tarpo
    JE Atidarymas
    
    CMP al, 0Dh                        ;iesko enterio
    JE  Sukurti
    
    MOV [si], ax
    INC si
    JMP Vardai
    
AtidarytiN PROC                       ;procedura duomenu failo atidarymui, siaip nelabai reikalinga cia man buvo rasyt procedura, bet aij...
    MOV ah, 3Dh
	MOV al, 0
	MOV dx, offset vardas
	INT 21h
	JC Klaida_a
	
	LEA si, vardas
	RET
AtidarytiN ENDP

Atidarymas:                            ;cia ateina kai nuskaito viena varda is parametru. Bando atidaryt failus.
    INC cl                             ;cl skaitliukas ziuri, kuri faila reikia atidaryt (duomenu1, duomenu2, rezultatu)
    MOV al, 0
    MOV [si], al
    
    CMP cl, 1
    JE Vardai
    
    CMP cl, 2
    JE Duomuo1
    
    CMP cl, 3
    JNE Sukurti
    
    CALL AtidarytiN                   ;atidaromas duomenu failas2
	
	MOV word ptr duom2f, ax
	JMP Vardai
    
Sukurti:                               ;sukuriamas rezultatu failas
    CMP cl, 3
    JB Helpas
    
    MOV al, 0
    MOV [si], al
    
    MOV ah, 3Ch
	MOV cx, 0
	MOV dx, offset vardas
	INT 21h
	JC Klaida_s
	
	MOV word ptr rezf, ax
	JMP Ilgiai

Duomuo1:                               ;atidaromas duomenu failas1
    CALL AtidarytiN
	
	MOV word ptr duom1f, ax
	JMP Vardai
	
klaida_a:                           ;ivairiu klaidu ir zinuciu spausdinimai i ekrana
    MOV cx, offset klaidaS            ;sitos 2 eilutes pades surasti kiek simboliu spausdinsim i ekrana proceduroje 'Spausdinti'
    MOV dx, offset klaidaA
    CALL Spausdinti
    JMP Baigta

klaida_s:
    MOV cx, offset klaidaU
    MOV dx, offset klaidaS    
    CALL Spausdinti
    JMP Baigta

helpas:
    MOV cx, offset klaidaA
    MOV dx, offset help
    CALL Spausdinti
    JMP Baigta
        
Spausdinti PROC                     ;procedura spausdinimui su ah, 40h funkcija
    SUB cx, dx
    MOV ah, 40h
    MOV bx, 1
    INT 21h
    
    RET
Spausdinti ENDP

Perbegti PROC                        ;sita procedura perbega duomenu faila, suskaiciuoja jo ilgi ir patikrina ar tikrai faile tik '0' ir '1'
    MOV  ax, 0
    PUSH ax
    
Ilgis:
    MOV ah, 3Fh                      ;nuskaitom po 20 simboliu
    MOV cx, 20
    MOV bx, word ptr [si]
    MOV dx, offset buffd1
    INT 21h
    JC Klaida_n
           
    POP cx                          ;simboliu kiekis bus fiksuojamas cx (ir steke)
    ADD cx, ax
    PUSH cx

    MOV bx, 0
    
    CMP ax, 0
    JE grizti

Ar_dvejetainis:                    ;cia tikrina ar nera kitokiu simboliu be '1' ir '0'
    MOV cl, [buffd1[bx]]
    CMP cl, 30h
    JE Didinti
    
    CMP cl, 31h
    JNE Klaida_d

Didinti:                            ;pasislenka buferyje per 1 pozicija
    INC bx    
    
    CMP bx, ax                      ;ziuri, ar visus simbolius patikrino
    JNE Ar_dvejetainis

    CMP ax, 20                       ;ziuri, kiek simboliu nuskaite. Jeigu 20, tai bando nuskaityti dar.
    JE Ilgis
    
Grizti:    
    POP cx
    RET
Perbegti ENDP
    
Ilgiai:                           ;kreipiasi i 'Perbegti' procedura, kad suskaiciuotu failu ilgius
    LEA si, duom1f
    CALL Perbegti
               
    PUSH cx

    LEA si, duom2f
    CALL Perbegti
    
    PUSH cx
    JMP Pointeris
    
Klaida_n:                               ;dar klaidu isvedimui
    MOV cx, offset klaidaI
    MOV dx, offset klaidaN
    CALL Spausdinti
    JMP Baigta

Klaida_d:
    MOV cx, offset sekme
    MOV dx, offset klaidaD
    CALL Spausdinti
    JMP Baigta
    
Pointeris:                           ;grazina failo pointerius i pradzia
    XOR cx, cx
    XOR dx, dx
    
    MOV ah, 42h
    MOV al, 0
    MOV bx, word ptr duom1f
    INT 21h
    
    MOV ah, 42h
    MOV al, 0
    MOV bx, word ptr duom2f
    INT 21h

    POP cx                            ;dabar pasiziurim failu ilgius
    POP ax
    
    CMP ax, cx                         ;ir nustatom ar kuris failas turi daugiau simboliu
    JA Skaitom1
    
    CMP ax, cx                       
    JE Nuskaitymas                
    
    SUB cx, ax
    
    LEA si, duom2f                   ;jeigu daugiau simboliu antram faile
    CALL Perteklius

Jump_klaida_n:                       ; :) tiesiog jumpas nepasieke
    JMP Klaida_n

Skaitom1:                          ;jeigu daugiau simboliu pirmam faile            
    SUB ax, cx
    MOV cx, ax
    
    LEA si, duom1f
    CALL Perteklius

Perteklius PROC                      ;sita procedura uzraso simboliu pertekliu is ilgesnio duomenu failo i rezultatu faila
    PUSH cx

Skaitom:                              ;cia ziuri kiek simboliu reiks nuskaityt
    POP cx
    CMP cx, 20
    JB Nuskaityti
    
    SUB cx, 20
    PUSH cx
    
    MOV cx, 20
    
Nuskaityti:                        ;nuskaito
    MOV ah, 3Fh
    MOV bx, word ptr [si]
    MOV dx, offset buffd1
    INT 21h
    JC Jump_klaida_n
    
    MOV cx, ax                   ;iraso i rezultatu faila
    MOV ah, 40h    
    MOV bx, word ptr rezf
    MOV dx, offset buffd1
    INT 21h
    JC Klaida_i 
    
    CMP cx, 20
    JE Skaitom   
    
    JMP Nuskaitymas
Perteklius ENDP

Klaida_i:                         
    MOV cx, offset klaidaD
    MOV dx, offset klaidaI
    CALL Spausdinti
    JMP Baigta

Nuskaitymas:                         ;kai jau abiejuose failuose liko po vienoda skaiciu simboliu...
    MOV ah, 3Fh                      ;nuskaitom duomenis is dvieju failu i du buferius
    MOV bx, word ptr duom1f
    MOV cx, 20
    MOV dx, offset buffd1
    INT 21h
    JC Jump_klaida_n
    
    MOV ah, 3Fh
    MOV bx, word ptr duom2f
    MOV cx, 20
    MOV dx, offset buffd2
    INT 21h
    JC Jump_klaida_n
    
    CMP ax, 0
    JE Uzdarymas
  
    MOV bx, 0

XORas:                                 ;darom nuskaitytiems simboliams XOR
    MOV cl, [buffd1[bx]]               
    MOV ch, [buffd2[bx]]
    
    CMP ch, cl                         
    JE Irasyti_0 
  
    MOV [buffrez[bx]], 31h
    JMP XOR_kitas 

Irasyti_0: 
    MOV [buffrez[bx]], 30h

XOR_kitas:
    INC bx
    
    CMP bx, ax
    JNE XORas
        
    MOV cx, ax                      ;rezultato irasymas
    MOV al, 0
    MOV ah, 40h
    MOV bx, word ptr rezf
    MOV dx, offset buffrez
    INT 21h
    JC klaida_i
    
    CMP cx, 20
    JE Nuskaitymas

Uzdarymas:                         ;uzdaro failus
    MOV ah, 3Eh
    MOV bx, word ptr duom1f
    INT 21h
    JC Klaida_u
    
    MOV ah, 3Eh
    MOV bx, word ptr duom2f
    INT 21h
    JC Klaida_u
    
    MOV ah, 3Eh
    MOV bx, word ptr rezf
    INT 21h
    JC Klaida_u
    
    MOV cx, offset vardas
    MOV dx, offset sekme
    CALL Spausdinti

    JMP Baigta
    
Klaida_u:
    MOV cx, offset klaidaN
    MOV dx, offset klaidaU
    CALL Spausdinti

Baigta:	                            ;standartine pabaiga + pauze
	MOV ah, 0
	INT 16h
	
	MOV ah, 4Ch
	MOV al, 0
	INT 21h

Kodas	ENDS
	END Pradzia   